﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Data.OleDb;
using System.Data;
using System.Collections;
using DashBoardEntidades;

namespace DashBoardDatos
{
    public class c_ControladorBaseDatos
    {
        
        /// <summary>
        /// Variables de la clase
        /// </summary>
        private SqlConnection _Conexion = new SqlConnection();
        private static c_ControladorBaseDatos _Instance;
        //----------------------------------------------------------
        /// <summary>
        /// Constructor del controlador
        /// </summary>
        /// <returns></returns>
        public static c_ControladorBaseDatos getInstance()
        {
            if (_Instance == null)
            {
                _Instance = new c_ControladorBaseDatos();
            }
            return _Instance;
        }

        #region Metodos Insertar
        //----------------------------------------------------------
        /// <summary>
        /// Inserta la informacion general en la base de datos, luego de haber
        /// recopilado la informacion del html
        /// </summary>
        /// <param name="_fechaHora"></param>
        /// <param name="_descripcion"></param>
        /// <param name="_rendimiento"></param>
        /// <param name="_precio"></param>
        /// <param name="_simbolo"></param>
        public void Ins_Info_Bonos(SqlDateTime _fechaHora, SqlDouble _precio, SqlDouble _precioCambio, SqlDouble _precioCierre, SqlDouble _rendimiento,SqlDouble _rendimientoCambio, SqlDouble _rendimientoCierre,   SqlString _tradeTime, SqlString _simbolo)
        {
            String _conexion = c_ConstantesDatos._dbSource + c_ConstantesDatos._dbCatalog + c_ConstantesDatos._dbName + c_ConstantesDatos._dbSecurity;
            SqlConnection _con = new SqlConnection(_conexion);
            SqlCommand _comando = new SqlCommand(c_ConstantesDatos.SP_InsertarInfoBono,_con);
            try
            {
                _comando.Connection.Open();
                _comando.CommandType = CommandType.StoredProcedure;
                _comando.Parameters.AddWithValue(c_ConstantesDatos._fechaHora, _fechaHora);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._precio, _precio);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._precioCambio, _precioCambio);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._precioCierre, _precioCierre);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._rendimiento, _rendimiento);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._rendimientoCambio, _rendimientoCambio);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._rendimientoCierre, _rendimientoCierre);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._horaTransaccion, _tradeTime);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._simbolo, _simbolo);
                _comando.ExecuteNonQuery();

            }
            catch (System.Exception Ex)
            {

                throw Ex;
            }
            finally
            {
                _comando.Connection.Close();
            }
        }
        //-----------------------------------------------------------------------
        /// <summary>
        /// Inserta distintos tipos de bono al sistema
        /// </summary>
        /// <param name="_descripcion"></param>
        public void Ins_TipoBono(SqlString _nombre, SqlString _simbolo)
        {
            String _conexion = c_ConstantesDatos._dbSource + c_ConstantesDatos._dbCatalog + c_ConstantesDatos._dbName + c_ConstantesDatos._dbSecurity;
            SqlConnection _con = new SqlConnection(_conexion);
            SqlCommand _comando = new SqlCommand(c_ConstantesDatos.SP_TipoBono,_con);
            try
            {
                _comando.Connection.Open();
                _comando.CommandType = CommandType.StoredProcedure;
                _comando.Parameters.AddWithValue(c_ConstantesDatos._NombreBono, _nombre);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._simbolo, _simbolo);
                _comando.ExecuteNonQuery();
            }
            catch (System.Exception Ex)
            {

                throw Ex;
            }
            finally
            {
                _comando.Connection.Close();
            }
        }
        //-----------------------------------------------------------------------
        /// <summary>
        /// Inserta un usuario nuevo en el sistema( todos los usuarios creados son tipo clinte no administrador)
        /// </summary>
        /// <param name="_nombreUsuario"></param>
        /// <param name="_nombre"></param>
        /// <param name="_apell1"></param>
        /// <param name="_apell2"></param>
        /// <param name="_correo"></param>
        /// <param name="_pass"></param>
        public void Ins_Usuario(SqlString _nombre, SqlString _nombreUsuario, SqlString _apell1, SqlString _apell2, SqlString _correo, SqlString _pass, String _tipoU)
        {
            String _conexion = c_ConstantesDatos._dbSource + c_ConstantesDatos._dbCatalog + c_ConstantesDatos._dbName + c_ConstantesDatos._dbSecurity;
            SqlConnection _con = new SqlConnection(_conexion);
            SqlCommand _comando = new SqlCommand(c_ConstantesDatos.SP_InsUsuario,_con);
            try
            {
                _comando.Connection.Open();
                _comando.CommandType = CommandType.StoredProcedure;
                _comando.Parameters.AddWithValue(c_ConstantesDatos._nombre, _nombre);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._apellido1, _apell1);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._apellido2, _apell2);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._NombreUsuario, _nombreUsuario);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._pass, _pass);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._correo, _correo);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._tipoUsuario, _tipoU);
                _comando.ExecuteNonQuery();

            }
            catch (System.Exception Ex)
            {

                throw Ex;
            }
            finally
            {
                _comando.Connection.Close();
            }
        }
        //---------------------------------------------------------
        /// <summary>
        /// Insertar en el sistema los valores de la bolsa
        /// </summary>
        /// <param name="_fechaHora"></param>
        /// <param name="_precio"></param>
        /// <param name="_descripcion"></param>
        /// <param name="_tipoValorBolsa"></param>
        public void Ins_ValoresBolsa(SqlDateTime _fechaHora, SqlDouble _precio, SqlString _descripcion, SqlString _tipoValorBolsa)
        {
            String _conexion = c_ConstantesDatos._dbSource + c_ConstantesDatos._dbCatalog + c_ConstantesDatos._dbName + c_ConstantesDatos._dbSecurity;
            SqlConnection _con = new SqlConnection(_conexion);
            SqlCommand _comando = new SqlCommand(c_ConstantesDatos.SP_InsValoresBolsa,_con);
            try
            {
                _comando.Connection.Open();
                _comando.CommandType = CommandType.StoredProcedure;
                _comando.Parameters.AddWithValue(c_ConstantesDatos._fechaHora, _fechaHora);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._precio, _precio);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._descripcion, _descripcion);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._tipoValorBolsa, _tipoValorBolsa);
                _comando.ExecuteNonQuery();
            }
            catch (System.Exception Ex)
            {

                throw Ex;
            }
            finally
            {
                _comando.Connection.Close();
            }
        }
        //--------------------------------------------------------------
        /// <summary>
        /// Inserta simbolo y nombre del valor de la bolsa en el sistema
        /// 
        /// </summary>
        /// <param name="_nombre"></param>
        /// <param name="simbolo"></param>
        public void Ins_TipoValorBolsa(SqlString _nombre, SqlString simbolo)
        {
            String _conexion = c_ConstantesDatos._dbSource + c_ConstantesDatos._dbCatalog + c_ConstantesDatos._dbName + c_ConstantesDatos._dbSecurity;
            SqlConnection _con = new SqlConnection(_conexion);
            SqlCommand _comando = new SqlCommand(c_ConstantesDatos.SP_InsTipoValorBolsa,_con);
            try
            {
                _comando.Connection.Open();
                _comando.CommandType = CommandType.StoredProcedure;
                _comando.Parameters.AddWithValue(c_ConstantesDatos._nombre, _nombre);
                _comando.Parameters.AddWithValue(c_ConstantesDatos._simbolo, simbolo);
                _comando.ExecuteNonQuery();
            }
            catch (System.Exception Ex)
            {

                throw Ex;
            }
            finally
            {
                _comando.Connection.Close();
            }
        }
        #endregion
        #region Seguridad
        /// <summary>
        /// Revisa si existe el usuario q se desea registrar
        /// </summary>
        public int SeguridadLogin(string _nUsuario, string _pass)
        {
            int Respuesta = 0;

            String _conexion = c_ConstantesDatos._dbSource + c_ConstantesDatos._dbCatalog + c_ConstantesDatos._dbName + c_ConstantesDatos._dbSecurity;
            SqlConnection _conn = new SqlConnection(_conexion);
            SqlCommand comando = new SqlCommand(c_ConstantesDatos.SP_Login, _conn);

            try
            {
                comando.Connection.Open();
                comando.CommandType = CommandType.StoredProcedure;
                comando.Parameters.AddWithValue(c_ConstantesDatos._NombreUsuario, _nUsuario);
                comando.Parameters.AddWithValue(c_ConstantesDatos._Pass, _pass);
                comando.Parameters.AddWithValue(c_ConstantesDatos._Error, Respuesta);

                SqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    Respuesta = (int)reader.GetValue(0);
                }

                return Respuesta;

            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                comando.Connection.Close();
            }
        }
        #endregion
        #region Metodos Obtener Informacion
        /// <summary>
        /// Retorna una lista de objetos que contiene la info de ambos tipos de bonos (parametros)
        /// </summary>
        /// <param name="tipo1"></param>
        /// <param name="tipo2"></param>
        /// <param name="fecha1"></param>
        /// <param name="fecha2"></param>
        /// <returns></returns>
        public SqlDataReader ObtComparaBonosPrecio(SqlString tipo1, SqlString tipo2, SqlDateTime fecha1, SqlDateTime fecha2)
        {

            String _conexion = c_ConstantesDatos._dbSource + c_ConstantesDatos._dbCatalog + c_ConstantesDatos._dbName + c_ConstantesDatos._dbSecurity;
            SqlConnection _con = new SqlConnection(_conexion);
            SqlCommand _comando = new SqlCommand(c_ConstantesDatos.SP_ComparaBonosPrecios, _con);
            try
            {
                _comando.Connection.Open();
                _comando.CommandType = CommandType.StoredProcedure;
                _comando.Parameters.AddWithValue(c_ConstantesDatos.TipoBono1, tipo1);
                _comando.Parameters.AddWithValue(c_ConstantesDatos.TipoBono2, tipo2);
                _comando.Parameters.AddWithValue(c_ConstantesDatos.Fecha1, fecha1);
                _comando.Parameters.AddWithValue(c_ConstantesDatos.Fecha2, fecha2);
                SqlDataReader Resultado = _comando.ExecuteReader();
                ArrayList _listaResultado = new ArrayList();



                return Resultado;
            }
            catch (SqlException ex)
            {

                throw ex;
            }
            finally { _Conexion.Close(); }

        }

        //*******************************************************************************************
        /// <summary>
        /// Retorna un objeto con la informacion(rendimiento) de comparar dos tipos de bonos
        /// </summary>
        /// <param name="tipo1"></param>
        /// <param name="tipo2"></param>
        /// <param name="fecha1"></param>
        /// <param name="fecha2"></param>
        /// <returns></returns>
        public SqlDataReader ObtComparaBonosRendimiento(SqlString tipo1, SqlString tipo2, SqlDateTime fecha1, SqlDateTime fecha2)
        {

            String _conexion = c_ConstantesDatos._dbSource + c_ConstantesDatos._dbCatalog + c_ConstantesDatos._dbName + c_ConstantesDatos._dbSecurity;
            SqlConnection _con = new SqlConnection(_conexion);
            SqlCommand _comando = new SqlCommand(c_ConstantesDatos.Sp_ComparaBonosRendimientos, _con);
            try
            {
                _comando.Connection.Open();
                _comando.CommandType = CommandType.StoredProcedure;
                _comando.Parameters.AddWithValue(c_ConstantesDatos.TipoBono1, tipo1);
                _comando.Parameters.AddWithValue(c_ConstantesDatos.TipoBono2, tipo2);
                _comando.Parameters.AddWithValue(c_ConstantesDatos.Fecha1, fecha1);
                _comando.Parameters.AddWithValue(c_ConstantesDatos.Fecha2, fecha2);
                SqlDataReader Resultado = _comando.ExecuteReader();
                ArrayList _listaResultado = new ArrayList();



                return Resultado;
            }
            catch (SqlException ex)
            {

                throw ex;
            }
            finally { _Conexion.Close(); }

        }
        //*******************************************************************************************
        /// <summary>
        /// Retorna la informacion en un lapso de tiempo de un bono especifico
        /// </summary>
        /// <param name="tipoBono"></param>
        /// <param name="fecha1"></param>
        /// <param name="fecha2"></param>
        /// <returns></returns>
        public SqlDataReader ObtInfoBonoPrecio(SqlString tipoBono, SqlDateTime fecha1, SqlDateTime fecha2)
        {

            String _conexion = c_ConstantesDatos._dbSource + c_ConstantesDatos._dbCatalog + c_ConstantesDatos._dbName + c_ConstantesDatos._dbSecurity;
            SqlConnection _con = new SqlConnection(_conexion);
            SqlCommand _comando = new SqlCommand(c_ConstantesDatos.SP_InfoBonoPrecio, _con);
            try
            {
                _comando.CommandType = CommandType.StoredProcedure;
                _comando.Parameters.AddWithValue(c_ConstantesDatos.TipoBono, tipoBono);
                _comando.Parameters.AddWithValue(c_ConstantesDatos.Fecha1, fecha1);
                _comando.Parameters.AddWithValue(c_ConstantesDatos.Fecha2, fecha2);
                SqlDataReader Resultado = _comando.ExecuteReader();
                ArrayList _listaResultado = new ArrayList();

   
                return Resultado;
            }
            catch (SqlException ex)
            {

                throw ex;
            }
            finally { _Conexion.Close(); }

        }
        //**************************************************************************************
        /// <summary>
        /// ObtInfo General
        /// </summary>
        /// <param name="tipoBono"></param>
        /// <param name="fecha1"></param>
        /// <param name="fecha2"></param>
        /// <returns></returns>
       /* public ArrayList ObtInfoGeneral()
        {

            String _conexion = c_ConstantesDatos._dbSource + c_ConstantesDatos._dbCatalog + c_ConstantesDatos._dbName + c_ConstantesDatos._dbSecurity;
            SqlConnection _con = new SqlConnection(_conexion);
            SqlCommand _comando = new SqlCommand(c_ConstantesDatos.SP_InfoBonoRendimiento, _con);
            try
            {
                _comando.CommandType = CommandType.StoredProcedure;
                SqlDataReader Resultado = _comando.ExecuteReader();
                ArrayList _listaResultado = new ArrayList();

                while (Resultado.Read())
                {
                    Bond objeto = new Bond();
                    objeto.Valor = Resultado.GetFloat(0);
                    objeto.Nombre = Resultado.GetString(1);
                    objeto.Fecha = Resultado.GetDateTime(2);
                    _listaResultado.Add(objeto);
                }

                return _listaResultado;
            }
            catch (SqlException ex)
            {

                throw ex;
            }
            finally { _Conexion.Close(); }

        }
        */
        //*********************************************************************************************
        /// <summary>
        /// Obtiene la informacion del rendimiento de un bono
        /// </summary>
        /// <param name="tipoBono"></param>
        /// <param name="fecha1"></param>
        /// <param name="fecha2"></param>
        /// <returns></returns>
        public SqlDataReader ObtInfoBonoRendimiento(SqlString tipoBono, SqlDateTime fecha1, SqlDateTime fecha2)
        {

            String _conexion = c_ConstantesDatos._dbSource + c_ConstantesDatos._dbCatalog + c_ConstantesDatos._dbName + c_ConstantesDatos._dbSecurity;
            SqlConnection _con = new SqlConnection(_conexion);
            SqlCommand _comando = new SqlCommand(c_ConstantesDatos.SP_InfoBonoRendimiento, _con);
            try
            {
                _comando.Connection.Open();
                _comando.CommandType = CommandType.StoredProcedure;
                _comando.Parameters.AddWithValue(c_ConstantesDatos.TipoBono, tipoBono);
                _comando.Parameters.AddWithValue(c_ConstantesDatos.Fecha1, fecha1);
                _comando.Parameters.AddWithValue(c_ConstantesDatos.Fecha2, fecha2);
                SqlDataReader Resultado = _comando.ExecuteReader();

                return Resultado;
            }
            catch (SqlException ex)
            {

                throw ex;
            }
            finally { _Conexion.Close(); }

        }

        //****************************************************************************************
        /// <summary>
        /// Retorna toda la informacion referente al bono
        /// </summary>
        /// <param name="tipoBono"></param>
        /// <returns></returns>
        public SqlDataReader ObtInfoGeneralBono(SqlString tipoBono)
        {

            String _conexion = c_ConstantesDatos._dbSource + c_ConstantesDatos._dbCatalog + c_ConstantesDatos._dbName + c_ConstantesDatos._dbSecurity;
            SqlConnection _con = new SqlConnection(_conexion);
            SqlCommand _comando = new SqlCommand(c_ConstantesDatos.SP_InfoGeneralBono, _con);
            try
            {
                _comando.Connection.Open();
                _comando.CommandType = CommandType.StoredProcedure;
                _comando.Parameters.AddWithValue(c_ConstantesDatos.TipoBono, tipoBono);
                SqlDataReader Resultado = _comando.ExecuteReader();
                ArrayList _listaResultado = new ArrayList();

                while (Resultado.Read())
                {
                    DashBoardBono objeto = new DashBoardBono();
                    objeto.FechaHora = Resultado.GetDateTime(0);
                    objeto.Precio = Resultado.GetFloat(1);
                    objeto.PrecioCambio = Resultado.GetFloat(2);
                    objeto.PrecioCierre = Resultado.GetFloat(3);
                    objeto.Rendimiento = Resultado.GetFloat(4);
                    objeto.RendimientoCambio = Resultado.GetFloat(5);
                    objeto.RendimientoCierre = Resultado.GetFloat(6);
                    objeto.TradeTime = Resultado.GetString(7);
                    _listaResultado.Add(objeto);
                }

                return Resultado;
            }
            catch (SqlException ex)
            {

                throw ex;
            }
            finally { _Conexion.Close(); }

        }

        //**************************************************************************************** 
        public ArrayList ObtTipoUsuario()
        {
            String _conexion = c_ConstantesDatos._dbSource + c_ConstantesDatos._dbCatalog + c_ConstantesDatos._dbName + c_ConstantesDatos._dbSecurity;
            SqlConnection _con = new SqlConnection(_conexion);
            SqlCommand _comando = new SqlCommand(c_ConstantesDatos.SP_GetTiposUsuario, _con);
            try
            {
                _comando.Connection.Open();
                _comando.CommandType = CommandType.StoredProcedure;
                SqlDataReader Resultado = _comando.ExecuteReader();
                ArrayList _listaResultado = new ArrayList();

                while (Resultado.Read())
                {
                    string tipo;
                    tipo = Resultado.GetString(0);
                    _listaResultado.Add(tipo);
                }

                return _listaResultado;
            }
            catch (SqlException ex)
            {

                throw ex;
            }
            finally { _Conexion.Close(); }

        }
        /// <summary>
        /// Retorna los tipos de bonos existentes en el sistema
        /// </summary>
        /// <returns></returns>
        public ArrayList ObtTipoBonos()
        {

            String _conexion = c_ConstantesDatos._dbSource + c_ConstantesDatos._dbCatalog + c_ConstantesDatos._dbName + c_ConstantesDatos._dbSecurity;
            SqlConnection _con = new SqlConnection(_conexion);
            SqlCommand _comando = new SqlCommand(c_ConstantesDatos.SP_GetTipoBonos, _con);
            try
            {
                _comando.Connection.Open();
                _comando.CommandType = CommandType.StoredProcedure;
                SqlDataReader Resultado = _comando.ExecuteReader();
                ArrayList _listaResultado = new ArrayList();

                while (Resultado.Read())
                {
                    string tipo;
                    tipo = Resultado.GetString(0);
                    _listaResultado.Add(tipo);
                }

                return _listaResultado;
            }
            catch (SqlException ex)
            {

                throw ex;
            }
            finally { _Conexion.Close(); }

        }
        //*******************************************************************************************


        #endregion
    }
}
